#pragma once

#include "Object/Object.h"
#include "Containers/ScriptDelegateImplement.h"
#include "EditorSplitableLayoutView.m.h"


class REditorSplitableLayoutViewModel;
class RWidget;
class RFunctionPositionerWidget;

RCLASS(ExtraHeader="Widgets/Widget.h")
class REditorSplitableLayoutView : public RObject 
{
    ROBJECT

public:
    void BindViewModel(TSharedObjectPtr<REditorSplitableLayoutViewModel> InViewModel );
    
    //创建ItemView的函数
    TScriptDelegate<
        TSharedObjectPtr<RObject> /*创建好的ItemVIew*/
        (TSharedObjectPtr<RObject> /*ItemViewModel*/ )
    > OnBindItemView;

    //填充ItemView的控件
    TScriptDelegate<void(
        TSharedObjectPtr<RObject> /*ItemView*/,
        TSharedObjectPtr<RWidget> /*ParentWidget*/ )>
        OnFillItemWidget;


    void CreateWidget(TSharedObjectPtr<RWidget> InParent);

protected:
    TWeakObjectPtr<REditorSplitableLayoutViewModel> ViewModel;

    TSharedObjectPtr<RFunctionPositionerWidget> Root;

    //布局树节点的控件，与布局树节点一一对应
    RFIELD()
    TVector<TSharedObjectPtr<RWidget> > Widgets;

    //分割线控件，与布局树节点一一对应
    RFIELD()
    TVector<TVector<TSharedObjectPtr<RWidget>>> Spliters;

    //叶子节点内部视图模型的视图
    //这个数组和节点一一对应
    RFIELD()
    TVector<TSharedObjectPtr<RObject>> ItemViews;

    //叶子节点内部视图模型,用于在布局变化时更新视图
    //这个数组和节点一一对应
    RFIELD()
    TVector<TSharedObjectPtr<RObject>> ItemViewModels;

    /// @brief 
    /// @param ReusedLeafWidgets 重复利用的控件，大小和ItemViewModels一样
    /// 如果ReusedWidgets[i]为空，表示ItemViewModels[i]对应的控件需要重新创建
    /// 只对叶子节点有效
    void UpdateWidget(const TVector<TSharedObjectPtr<RWidget>>& ReusedLeafWidgets);
};
